package dao

import (
	"gorm.io/gorm"
	"log"
	"lottery/models"
)

type ResultDao struct {
	engine *gorm.DB
}

// 公共方法，实例化方法
func NewResultDao(engine *gorm.DB) *ResultDao {
	return &ResultDao{
		engine: engine,
	}
}

// 查找单一值
func (d *ResultDao) Get(id int) (*models.LtResult, bool) {
	data := &models.LtResult{}
	// 查询数据
	err := d.engine.First(&data, id).Error
	if err != nil { // 未获取到，得到的是空对象
		return data, false
	}
	return data, true
}

// 查找全部
func (d *ResultDao) GetAll(page, size int) ([]models.LtResult, bool) {
	// 计算偏移量
	offset := (page - 1) * size
	datalist := make([]models.LtResult, 0)
	// 返回所有数据，按照状态和 删除
	err := d.engine.Order("id desc").
		Limit(size).Offset(offset).Find(&datalist).Error
	if err != nil { // 错误了，写个日志
		log.Println("gift_dao.GetAll error = ", err.Error())
		return datalist, false
	}
	return datalist, true
}

// 查找总数
func (d *ResultDao) CountAll() int64 {
	var num int64
	d.engine.Table("lt_results").Count(&num)
	return num
}

// 删除操作不做物理删除， 逻辑删除，更新字段
func (d *ResultDao) Delete(id int) error {
	data := &models.LtResult{Id: id}
	err := d.engine.Model(&data).
		Update("sys_status", 1).Error

	return err
}

func (d *ResultDao) GetNewPrize(size int, giftIds []int) []models.LtResult {
	datalist := make([]models.LtResult, 0)
	err := d.engine.
		Where("gift_id in ?", giftIds).
		Order("id desc").
		Limit(size).
		Find(&datalist).Error
	if err != nil {
		return datalist
	} else {
		return datalist
	}
}

// 更新操作: 针对传入的指定 columns，字段名，进行查询
func (d *ResultDao) Update(data *models.LtResult, columns []string) error {
	err := d.engine.Model(data).Select(columns).Updates(data).Error
	return err
}

// 执行创建操作
func (d *ResultDao) Create(data *models.LtResult) error {
	err := d.engine.Create(data).Error
	return err
}

// 查找: 按照 giftId
func (d *ResultDao) SearchByGift(giftId, page, size int) []models.LtResult {
	// 计算偏移量
	offset := (page - 1) * size
	datalist := make([]models.LtResult, 0)
	// 返回所有数据，按照状态和 删除
	_ = d.engine.Where(&models.LtResult{GiftId: giftId}).Order("id desc").
		Offset(offset).Limit(size).Find(&datalist)

	return datalist
}

// 查找： 按照 uid
func (d *ResultDao) SearchByUser(uid, page, size int) []models.LtResult {
	// 计算偏移量
	offset := (page - 1) * size
	datalist := make([]models.LtResult, 0)
	// 返回所有数据，按照状态和 删除
	_ = d.engine.Where(&models.LtResult{Uid: uid}).Order("id desc").
		Offset(offset).Limit(size).Find(&datalist)

	return datalist
}

// 数量： gift
func (d *ResultDao) CountByGift(giftId int) int64 {
	var num int64
	d.engine.Table("lt_results").Where("gift_id = ?", giftId).Debug().Count(&num)
	return num
}

// 数量： uid
func (d *ResultDao) CountByUser(uid int) int64 {
	var num int64
	d.engine.Where(&models.LtResult{Uid: uid}, "uid").Debug().Count(&num)
	return num
}
